package com.passion.common.login.impl;

import cn.dev33.satoken.secure.SaSecureUtil;
import com.passion.common.exception.MyException;
import com.passion.common.login.LoginService;
import com.passion.common.util.DataBeanUtil;
import com.passion.context.BizServiceBeanContext;
import com.passion.context.MiddlewareContext;
import com.passion.context.StdServiceContext;
import com.passion.domain.entity.SysUser;
import com.passion.frm.UserLoginFrm;
import com.passion.vo.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * 类描述：
 *
 * @author ZhuYin
 * @since 2024年12月26日
 */
@Slf4j
@Service
public class LoginServiceImpl implements LoginService {

    /**
     * 方法说明：处理登录业务
     *
     * @param frm 登录请求参数对象
     * @return 类描述：登录用户信息
     * @author ZhuYin
     * @since 2024年12月26日
     */
    @Override
    public LoginUser doLogin(UserLoginFrm frm) {
        // 校验验证码
        String verifyCodeKey = frm.getVerifyCodeKey();
        String verifyCode = frm.getVerifyCode();
        if (StringUtils.isNotBlank(verifyCodeKey)) {
            Object o = MiddlewareContext.cache.get(verifyCodeKey);
            if (!Objects.equals(o, verifyCode)) {
                throw new MyException("验证码错误");
            }
        }
        // 校验用户名密码
        String account = frm.getAccount();
        SysUser user = StdServiceContext.sysUserService.getUserByAccount(account);
        if (user == null) {
            throw new MyException("用户名或密码错误");
        }
        String passwd = frm.getPasswd();
        String userSalt = user.getUserSalt();
        String enPasswd = SaSecureUtil.md5BySalt(passwd, userSalt);
        String strongPasswd = SaSecureUtil.md5(enPasswd);
        if (!strongPasswd.equals(user.getUserPasswd())) {
            throw new MyException("用户名或密码错误");
        }
        // 用户信息返回给controller层之前清除掉敏感信息
        user.setUserSalt("");
        user.setUserPasswd("");
        // 将登录后的用户对象设置到用户上下文对象中
        BizServiceBeanContext.userContext.setSysUser(user);
        LoginUser loginUser = DataBeanUtil.copyOf(user, LoginUser.class, true);
        loginUser.setAccount(user.getUserLoginName());
        return loginUser;
    }

    public static void main(String[] args) {
        String source = "tlkj@admin";
        // 生成盐
        String salt = "npnvOJvqdJLDes4EAqPd";
        System.out.println("盐: " + salt);

        // 使用盐加盐
        String sourceWithSalt = SaSecureUtil.md5BySalt(source, salt);
        System.out.println("加盐后的数据: " + sourceWithSalt);

        // 加密数据
        String encrypt = SaSecureUtil.md5(sourceWithSalt);
        System.out.println("加盐并MD5后的数据: " + encrypt);
    }
}
